    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Asistencia;
import sv.com.compassion.entidades.Biblias;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.entidades.Visitas;
import sv.com.compassion.util.ComunAction;

/** Clase para reporte de Información Adicional(Entrega de biblias, Visitas a Hogar y plan para mañana ) 
* de Beneficiarios. 
* @author grupo de Tesis
*/
public class ReportInfoAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Cdi cdi;
    
    private String idCdis;
    private String fecIni;
    private String fecFin;
    private String modo;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a las clases entidades que se necesiten. 
 */  
public ReportInfoAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        cdi = new    Cdi();
        
        cdi.setIdMunicipio(new Municipio());
}   
/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(cdi);        
        return null;
    }
       
    @Override    
    public void agregarEntidad(Object o) {
    }
        @Override
    public void borrarEntidad(Object o) {
    }
    @Override
    public void editarEntidad(Object o) {
    }
    @Override
    public void alimentarGrid() {
    }
 /**
 * Método para desplegar el reporte de Información Adicional.
 */ 
    @Override
    public void reporteXls() {
        modo = getRequest().getParameter("Modo");
        if(modo.equals("1")){
            modoMensual();
        }else{
            modoAnual();
        }
    }
/**
 * Método para reporte Mensual de Información Adicional, esté modo se selecciona en el mantenimiento.
 */     
    public void modoMensual(){
         /////////////////////////////////////
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportInfoM.xlt");
                FileInputStream stream = new FileInputStream(ruta); 
                libro = new HSSFWorkbook(stream);     

                response.setHeader("Pragma", "cache");          
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportInfoM.xls");
 
        
        /////////////////////////////////////
        
        HSSFCellStyle styleBordere = libro.createCellStyle();
        HSSFFont fontReport = libro.createFont();
        fontReport.setFontHeightInPoints((short)10);
        styleBordere.setFont(fontReport);
        fontReport.setFontName("Arial");
        styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
        styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
        styleBordere.setBorderRight(styleBordere.BORDER_THIN);
        styleBordere.setBorderTop(styleBordere.BORDER_THIN);
        styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        HSSFCellStyle styleBordere2 = libro.createCellStyle();
        styleBordere2.setBorderBottom(styleBordere.BORDER_THIN);
        styleBordere2.setBorderLeft(styleBordere.BORDER_THIN);
        styleBordere2.setBorderRight(styleBordere.BORDER_THIN);
        styleBordere2.setBorderTop(styleBordere.BORDER_THIN);
        styleBordere2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        HSSFCellStyle styleBordereCdi = libro.createCellStyle();
        HSSFFont fontReportCdi = libro.createFont();
        fontReportCdi.setFontHeightInPoints((short)8);
        styleBordereCdi.setFont(fontReportCdi);
        fontReportCdi.setFontName("Arial");
        styleBordereCdi.setBorderBottom(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderLeft(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderRight(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderTop(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setAlignment(HSSFCellStyle.ALIGN_CENTER);
               
        HSSFSheet sheet = libro.getSheet("Hoja1");
        
        HSSFRow row = sheet.getRow(1);
        HSSFCell celda = null;
        
        HSSFRow rowTemp = sheet.getRow(1);
        HSSFCell celdaTemp = null;
        
        Date      today    =   new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy");

        row = sheet.getRow(9);
        celda = row.getCell(1);
        
        HSSFCellStyle styleTemp = celda.getCellStyle();
        
        styleBordere2.setFillBackgroundColor( styleTemp.getFillBackgroundColor() );
        styleBordere2.setFillForegroundColor( styleTemp.getFillForegroundColor() );
        styleBordere2.setFillPattern( styleTemp.getFillPattern() );
        styleBordere2.setFont( libro.getFontAt( styleTemp.getFontIndex() ) );
        
        row = sheet.createRow(3);
        celda = row.createCell(6);
        celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
        celda.setCellStyle(styleBordere);
        int col = 2;
        int fila  = 9;    
        int columnaFinal = 0;

        
        ////////////////////////////////////
        
        String query="";
        idCdis = getRequest().getParameter("IdCdis");
        fecIni = getRequest().getParameter("FecIni");
        fecFin = getRequest().getParameter("FecFin");
        
        int mesInicial = Integer.parseInt(fecIni.substring(0,2));
       
        int mesFinal = Integer.parseInt(fecFin.substring(0,2));
        
        int mesTemp = mesInicial;
        
        int annio = Integer.parseInt(fecFin.substring(3,7));
        
        row = sheet.getRow(fila);
        celda = row.getCell(col); 
        
        if(mesInicial != mesFinal)
            celda.setCellValue(new HSSFRichTextString(escribirMes(mesInicial) + "/" + String.valueOf(annio) + " - " + escribirMes(mesFinal) + "/" + String.valueOf(annio)));
        else 
            celda.setCellValue(new HSSFRichTextString(escribirMes(mesInicial)  + "/" + String.valueOf(annio)));
        
        celda.setCellStyle(styleBordere);
        
        columnaFinal = 8;
        
        String idCdi = "";
        int ind = 0;
        
        List<Asistencia> listaBeneficiario;
        List<Cdi> listaCdi;
        Asistencia b;

        String tempIdCdis = idCdis;
                     
        int totalMensual = 0; 
        
        int idRangoEdad = 1;
        
        DecimalFormat df = new DecimalFormat("0.00"); 

        fila  = 13; 
        
        //////////////Impresión de CDI's incluidos/////////////
        
        int contadorLinea = 0;
        int contadorEnter = 0;
        String cdiFinal = "";
        while(idCdis.length() > 1){
            ind = idCdis.indexOf(",");
            idCdi = idCdis.substring(0,ind);
            idCdis = idCdis.substring(ind+1,idCdis.length()); 
            
            query = "SELECT c FROM Cdi c WHERE c.idCdi = '" +idCdi +"'";
            listaCdi = genericoDAO.find(query, null, null);

            cdiFinal = cdiFinal + listaCdi.get(0).getNomCdi() + ",";
            
            contadorEnter++;
            if(contadorEnter == 10){
                cdiFinal = cdiFinal + "\n";
                contadorEnter = 0;
                contadorLinea++;
            }
        }
        
        sheet.addMergedRegion(new Region(19,(short)4,19+contadorLinea,(short)7));
        
        int filaCdi = 22;
        int columnaCdi = 4;
        
        int filaFinalCdi = 22+contadorLinea;
        int columnaFinalCdi = 7;
        
        row = sheet.getRow(filaCdi);
        celda = row.getCell(columnaCdi);
        
        cdiFinal = cdiFinal.substring(0, cdiFinal.length()-1);

        celda.setCellValue(new HSSFRichTextString(cdiFinal));

        while(filaCdi <= filaFinalCdi){
            while(columnaCdi <= columnaFinalCdi){
                row = sheet.getRow(filaCdi);
                celda = row.getCell(columnaCdi);
                celda.setCellStyle(styleBordereCdi);
                columnaCdi++;
            }
            columnaCdi = 4;
            filaCdi++;
        }
        
        idCdis = tempIdCdis;
  
        ///////////////////////////Inicia Conteo para A. de Servicio////////////////////////////

        col = 2;
        int subTotalMensual = 0;
        ArrayList<Integer> benSav = new ArrayList();
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (A. de Servicio)////////////////////////
            idCdis = tempIdCdis;
            
            while(mesInicial <= mesFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(2);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(2);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(2);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                
                mesInicial++;
            }
            
        ///////////////////////////Inicia Conteo para A. Extracurriculares////////////////////////////

        col = 3;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        benSav.clear();
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (A. Extracurriculares)////////////////////////
            idCdis = tempIdCdis;
            
            while(mesInicial <= mesFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(3);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(3);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(3);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(3);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(3);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                mesInicial++;
            }
            
            
        ///////////////////////////Inicia Conteo para Visitas a hogar////////////////////////////

        col = 4;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        List<Visitas> listaVisitasBen;
        List<Visitas> listaVisitas;
        Visitas v;
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     
 
                    int totalAss = 0;

                    query = "SELECT v FROM Visitas v WHERE YEAR(v.fecVisita) = '" + annio + "' "
                            + "and MONTH(v.fecVisita) = '" + mesInicial + "' "
                            + "and v.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and v.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY v.idBeneficiario ORDER BY v.idBeneficiario";
                    
                    listaVisitasBen = genericoDAO.find(query, null, null);
   
                    int i = 0;

                    while(listaVisitasBen.size() > i){
                            v = listaVisitasBen.get(i);
                            listaVisitas = genericoDAO.find("SELECT v FROM Visitas v WHERE YEAR(v.fecVisita) = '" + annio + "' "
                                + "and MONTH(v.fecVisita) = '" + mesInicial + "' "
                                + "and v.idBeneficiario = '" + v.getIdBeneficiario().getIdBeneficiario() + "'",null,null);
                            int l = 0;
                            while (listaVisitas.size() > l){
                                totalAss = totalAss  + listaVisitas.get(l).getCantVisita();
                                l++;
                            }
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ///////////////////////////Inicia Conteo para Biblias entregadas////////////////////////////

        col = 5;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        benSav.clear();
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 6) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 6) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "   
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (Biblias entregadas)////////////////////////
            idCdis = tempIdCdis;
            
            while(mesInicial <= mesFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 6) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 6) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(5);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(5);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(5);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(5);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(5);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                mesInicial++;
            }
        
        ///////////////////////////Inicia Conteo para Profesiones de fe////////////////////////////

        col = 6;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    int tempProFe = 0;
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    query = "SELECT COUNT(b) FROM Beneficiario b WHERE YEAR(b.fecProFeBeneficiario) = '" + annio + "' "
                            + "and MONTH(b.fecProFeBeneficiario) = '" + mesInicial + "' "
                            + "and b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') "
                            + "and b.idCdi = '" + idCdi+ "' ";
                    tempProFe = genericoDAO.countRow(query);        
                    totalCdis = totalCdis + tempProFe;
                    
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ///////////////////////////Inicia Conteo para Chequeos médicos////////////////////////////

        col = 7;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        benSav.clear();
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 5) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 5) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "   
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (Chequeos médicos)////////////////////////
            idCdis = tempIdCdis;
            
            while(mesInicial <= mesFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 5) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annio + "' "
                                + "and MONTH(x.fecAsistencia) = '" + mesInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 5) "
                                + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(7);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(7);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(7);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(7);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(7);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                mesInicial++;
            }
               
        ///////////////////////////Inicia Conteo para Tratamientos médicos////////////////////////////

        col = 8;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        mesInicial = mesTemp;

        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(mesInicial <= mesFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    int chequeos = 0;
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    query = "SELECT COUNT(c) FROM Chequeo c WHERE YEAR(c.fecConsulta) = '" + annio + "' "
                            + "and MONTH(c.fecConsulta) = '" + mesInicial + "' "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') ";
                    chequeos = genericoDAO.countRow(query);        
                    totalCdis = totalCdis + chequeos;
                    
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                mesInicial++;
            }
            mesInicial = mesTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        /////////////////////////////////////////////////////////////////////////////////////
        
            
            
        HSSFCellStyle styleBordere3 = libro.createCellStyle();
        
        row = sheet.getRow(12);
        celda = row.getCell(1);
        
        HSSFCellStyle styleTemp2 = celda.getCellStyle();
        
        styleBordere3.setFont( libro.getFontAt( styleTemp2.getFontIndex() ) );
        styleBordere3.setFillBackgroundColor(HSSFColor.AQUA.index);
        styleBordere3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        styleBordere3.setFillForegroundColor(HSSFColor.AQUA.index);
        styleBordere3.setBorderBottom(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderLeft(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderRight(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderTop(styleBordere3.BORDER_THIN);
        styleBordere3.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        //sheet.addMergedRegion(new Region(fila,(short)1,fila,(short)--col));
        
        row = sheet.getRow(fila);
        celda = row.getCell(1);
        celda.setCellValue(new HSSFRichTextString("TOTALES"));
        celda.setCellStyle(styleBordere3);
        
        int k = 2;
        int y2 = 13;
        int acumSubMensual = 0;
        String valorTemp = "";
        while(k <= columnaFinal){
            while(y2 <= 17){
                row = sheet.getRow(y2);
                celda = row.getCell(k);
                valorTemp = celda.getRichStringCellValue().toString();
                acumSubMensual = acumSubMensual + Integer.valueOf(valorTemp);
                y2++;
            }
            
            row = sheet.getRow(y2);
            celda = row.getCell(k);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(acumSubMensual)));
            celda.setCellStyle(styleBordere3);
            y2 = 13;
            acumSubMensual = 0;
            k++;
        }

        libro.write(out);
        out.flush();
        out.close();
            
        }catch(Exception e){
          e.printStackTrace();
        }
    }
/**
 * Método para reporte Anual de Información Adicional, esté modo se selecciona en el mantenimiento.
 */         
    public void modoAnual(){
          /////////////////////////////////////
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportInfoM.xlt");
                FileInputStream stream = new FileInputStream(ruta); 
                libro = new HSSFWorkbook(stream);     

                response.setHeader("Pragma", "cache");          
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportInfoM.xls");
 
        
        /////////////////////////////////////
        
        HSSFCellStyle styleBordere = libro.createCellStyle();
        HSSFFont fontReport = libro.createFont();
        fontReport.setFontHeightInPoints((short)10);
        styleBordere.setFont(fontReport);
        fontReport.setFontName("Arial");
        styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
        styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
        styleBordere.setBorderRight(styleBordere.BORDER_THIN);
        styleBordere.setBorderTop(styleBordere.BORDER_THIN);
        styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        HSSFCellStyle styleBordere2 = libro.createCellStyle();
        styleBordere2.setBorderBottom(styleBordere.BORDER_THIN);
        styleBordere2.setBorderLeft(styleBordere.BORDER_THIN);
        styleBordere2.setBorderRight(styleBordere.BORDER_THIN);
        styleBordere2.setBorderTop(styleBordere.BORDER_THIN);
        styleBordere2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        HSSFCellStyle styleBordereCdi = libro.createCellStyle();
        HSSFFont fontReportCdi = libro.createFont();
        fontReportCdi.setFontHeightInPoints((short)8);
        styleBordereCdi.setFont(fontReportCdi);
        fontReportCdi.setFontName("Arial");
        styleBordereCdi.setBorderBottom(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderLeft(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderRight(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setBorderTop(styleBordereCdi.BORDER_THIN);
        styleBordereCdi.setAlignment(HSSFCellStyle.ALIGN_CENTER);
               
        HSSFSheet sheet = libro.getSheet("Hoja1");
        
        HSSFRow row = sheet.getRow(1);
        HSSFCell celda = null;
        
        HSSFRow rowTemp = sheet.getRow(1);
        HSSFCell celdaTemp = null;
        
        Date      today    =   new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy");

        row = sheet.getRow(9);
        celda = row.getCell(1);
        
        HSSFCellStyle styleTemp = celda.getCellStyle();
        
        styleBordere2.setFillBackgroundColor( styleTemp.getFillBackgroundColor() );
        styleBordere2.setFillForegroundColor( styleTemp.getFillForegroundColor() );
        styleBordere2.setFillPattern( styleTemp.getFillPattern() );
        styleBordere2.setFont( libro.getFontAt( styleTemp.getFontIndex() ) );
        
        row = sheet.createRow(3);
        celda = row.createCell(6);
        celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
        celda.setCellStyle(styleBordere);
        int col = 2;
        int fila  = 9;    
        int columnaFinal = 0;

        
        ////////////////////////////////////
        
        String query="";
        idCdis = getRequest().getParameter("IdCdis");
        fecIni = getRequest().getParameter("FecIni");
        fecFin = getRequest().getParameter("FecFin");
        
        int annioInicial = Integer.parseInt(fecIni);
       
        int annioFinal = Integer.parseInt(fecFin);
        
        int annioTemp = annioInicial;
        
        row = sheet.getRow(fila);
        celda = row.getCell(col); 
        
        if(annioInicial != annioFinal)
            celda.setCellValue(new HSSFRichTextString(String.valueOf(annioInicial) + " - " + String.valueOf(annioFinal)));
        else 
            celda.setCellValue(new HSSFRichTextString(String.valueOf(annioInicial)));
        
        celda.setCellStyle(styleBordere);
        
        columnaFinal = 8;
        
        String idCdi = "";
        int ind = 0;
        
        List<Asistencia> listaBeneficiario;
        List<Cdi> listaCdi;
        Asistencia b;

        String tempIdCdis = idCdis;
                     
        int totalMensual = 0; 
        
        int idRangoEdad = 1;

        fila  = 13; 
        
        //////////////Impresión de CDI's incluidos/////////////
        
        int contadorLinea = 0;
        int contadorEnter = 0;
        String cdiFinal = "";
        while(idCdis.length() > 1){
            ind = idCdis.indexOf(",");
            idCdi = idCdis.substring(0,ind);
            idCdis = idCdis.substring(ind+1,idCdis.length()); 
            
            query = "SELECT c FROM Cdi c WHERE c.idCdi = '" +idCdi +"'";
            listaCdi = genericoDAO.find(query, null, null);

            cdiFinal = cdiFinal + listaCdi.get(0).getNomCdi() + ",";
            
            contadorEnter++;
            if(contadorEnter == 10){
                cdiFinal = cdiFinal + "\n";
                contadorEnter = 0;
                contadorLinea++;
            }
        }
        
        sheet.addMergedRegion(new Region(19,(short)4,19+contadorLinea,(short)7));
        
        int filaCdi = 22;
        int columnaCdi = 4;
        
        int filaFinalCdi = 22+contadorLinea;
        int columnaFinalCdi = 7;
        
        row = sheet.getRow(filaCdi);
        celda = row.getCell(columnaCdi);
        
        cdiFinal = cdiFinal.substring(0, cdiFinal.length()-1);

        celda.setCellValue(new HSSFRichTextString(cdiFinal));

        while(filaCdi <= filaFinalCdi){
            while(columnaCdi <= columnaFinalCdi){
                row = sheet.getRow(filaCdi);
                celda = row.getCell(columnaCdi);
                celda.setCellStyle(styleBordereCdi);
                columnaCdi++;
            }
            columnaCdi = 4;
            filaCdi++;
        }
        
        idCdis = tempIdCdis;
  
        ///////////////////////////Inicia Conteo para A. de Servicio////////////////////////////

        col = 2;
        int subTotalMensual = 0;
        ArrayList<Integer> benSav = new ArrayList();
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (A. de Servicio)////////////////////////
            idCdis = tempIdCdis;
            
            while(annioInicial <= annioFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 2) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(2);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(2);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(2);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                
                annioInicial++;
            }
            
        ///////////////////////////Inicia Conteo para A. Extracurriculares////////////////////////////

        col = 3;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        benSav.clear();
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  
                    int totalAss = 0;

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = '" + idRangoEdad + "') "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    totalAss++;
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                }
                            }
                            asistencia = 0;
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ////////////////////////Para rango de edad "Sin restricción" (A. Extracurriculares)////////////////////////
            idCdis = tempIdCdis;
            
            while(annioInicial <= annioFinal){    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    int asistencia = 0;  

                    query = "SELECT x FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idTipoActividad = 3) "
                            + "and x.idActividad IN (SELECT a.idActividad FROM Actividad a WHERE a.idranEdad = 6) "
                            + "and x.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY x.idBeneficiario ORDER BY x.idBeneficiario";
                    
                    listaBeneficiario = genericoDAO.find(query, null, null);
   
                    int i = 0;
                    while(listaBeneficiario.size() > i){
                            b = listaBeneficiario.get(i);
                            asistencia = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioInicial + "' "
                                + "and x.asistio = 1 "
                                + "and x.idBeneficiario = '" + b.getIdBeneficiario().getIdBeneficiario() + "'");
                            if(asistencia > 0){
                                if(!benSav.contains(b.getIdBeneficiario().getIdBeneficiario())){
                                    int edadBen = b.getIdBeneficiario().getEdaBeneficiario();
                                    int valorCeldaTemp = 0;
                                    if(edadBen >= 3 && edadBen <= 5){
                                        row = sheet.getRow(13);
                                        celda = row.getCell(2);
                                        valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                        valorCeldaTemp++;
                                        celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                    }else{
                                        if(edadBen >= 6 && edadBen <= 10){
                                            row = sheet.getRow(14);
                                            celda = row.getCell(2);
                                            valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                            valorCeldaTemp++;
                                            celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                        }else{
                                            if(edadBen >= 9 && edadBen <= 11){
                                                row = sheet.getRow(15);
                                                celda = row.getCell(2);
                                                valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                valorCeldaTemp++;
                                                celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                            }else{
                                                if(edadBen >= 12 && edadBen <= 14){
                                                    row = sheet.getRow(16);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }else{
                                                    row = sheet.getRow(17);
                                                    celda = row.getCell(2);
                                                    valorCeldaTemp = Integer.valueOf(celda.getRichStringCellValue().toString());
                                                    valorCeldaTemp++;
                                                    celda.setCellValue(new HSSFRichTextString(String.valueOf(valorCeldaTemp)));
                                                }
                                            }
                                        }
                                    }
                                    benSav.add(b.getIdBeneficiario().getIdBeneficiario());
                                    celda.setCellStyle(styleBordere);
                                }
                            }
                            i++;
                    } 
                }
                
                idCdis = tempIdCdis;
                annioInicial++;
            }
            
            
        ///////////////////////////Inicia Conteo para Visitas a hogar////////////////////////////

        col = 4;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        List<Visitas> listaVisitasBen;
        List<Visitas> listaVisitas;
        Visitas v;
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     
 
                    int totalAss = 0;

                    query = "SELECT v FROM Visitas v WHERE YEAR(v.fecVisita) = '" + annioInicial + "' "
                            + "and v.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and v.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY v.idBeneficiario ORDER BY v.idBeneficiario";
                    
                    listaVisitasBen = genericoDAO.find(query, null, null);
   
                    int i = 0;

                    while(listaVisitasBen.size() > i){
                            v = listaVisitasBen.get(i);
                            listaVisitas = genericoDAO.find("SELECT v FROM Visitas v WHERE YEAR(v.fecVisita) = '" + annioInicial + "' "
                                + "and v.idBeneficiario = '" + v.getIdBeneficiario().getIdBeneficiario() + "'",null,null);
                            int l = 0;
                            while (listaVisitas.size() > l){
                                totalAss = totalAss  + listaVisitas.get(l).getCantVisita();
                                l++;
                            }
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
         ///////////////////////////Inicia Conteo para Biblias entregadas////////////////////////////

        col = 5;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        List<Biblias> listaBibliasBen;
        List<Biblias> listaBiblias;
        Biblias y;
        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     
 
                    int totalAss = 0;

                    query = "SELECT y FROM Biblias y WHERE YEAR(y.fecBiblia) = '" + annioInicial + "' "
                            + "and y.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and y.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "GROUP BY y.idBeneficiario ORDER BY y.idBeneficiario";
                    
                    listaBibliasBen = genericoDAO.find(query, null, null);
   
                    int i = 0;

                    while(listaBibliasBen.size() > i){
                            y = listaBibliasBen.get(i);
                            listaBiblias = genericoDAO.find("SELECT y FROM Biblias y WHERE YEAR(y.fecBiblia) = '" + annioInicial + "' "
                                + "and y.idBeneficiario = '" + y.getIdBeneficiario().getIdBeneficiario() + "'",null,null);
                            int l = 0;
                            while (listaBiblias.size() > l){
                                totalAss = totalAss  + listaBiblias.get(l).getCantBiblia();
                                l++;
                            }
                            i++;
                    } 
                            
                    totalCdis = totalCdis + totalAss;
                    
                    totalAss = 0; 
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }           
        
        ///////////////////////////Inicia Conteo para Profesiones de fe////////////////////////////

        col = 6;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    int tempProFe = 0;
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    query = "SELECT COUNT(b) FROM Beneficiario b WHERE YEAR(b.fecProFeBeneficiario) = '" + annioInicial + "' "
                            + "and b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') "
                            + "and b.idCdi = '" + idCdi+ "' ";
                    tempProFe = genericoDAO.countRow(query);        
                    totalCdis = totalCdis + tempProFe;
                    
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        ///////////////////////////Inicia Conteo para Chequeos médicos////////////////////////////

        col = 7;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    int chequeos = 0;
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    query = "SELECT COUNT(c) FROM Chequeo c WHERE YEAR(c.fecConsulta) = '" + annioInicial + "' "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') ";
                    chequeos = genericoDAO.countRow(query);        
                    totalCdis = totalCdis + chequeos;
                    
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
                
        ///////////////////////////Inicia Conteo para Tratamientos médicos////////////////////////////

        col = 8;
        fila = 13;
        
        subTotalMensual = 0;
        idCdis = tempIdCdis;
        totalMensual = 0;
        annioInicial = annioTemp;

        idRangoEdad = 1;
        
        while(idRangoEdad <= 5){
            while(annioInicial <= annioFinal){ 
                int totalCdis = 0;    
                while(idCdis.length() > 1){
                    int trats = 0;
                    ind = idCdis.indexOf(",");
                    idCdi = idCdis.substring(0,ind);
                    idCdis = idCdis.substring(ind+1,idCdis.length());     

                    query = "SELECT COUNT(c) FROM Chequeo c WHERE YEAR(c.fecConsulta) = '" + annioInicial + "' "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.edaBeneficiario >= (SELECT r.limMin FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "') and "
                            + "b.edaBeneficiario <= (SELECT r.limMax FROM Rangoedad r WHERE r.idRangoEdad = '" + idRangoEdad + "')) "
                            + "and c.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi = '" + idCdi+ "') "
                            + "and c.tratMedico != NULL";
                    trats = genericoDAO.countRow(query);        
                    totalCdis = totalCdis + trats;
                    
                }

                subTotalMensual = subTotalMensual + totalCdis; 
                
                idCdis = tempIdCdis;
                totalCdis = 0;
                
                annioInicial++;
            }
            annioInicial = annioTemp;
            
            row = sheet.getRow(fila++);
            celda = row.getCell(col);
            
            totalMensual = totalMensual + subTotalMensual;
            celda.setCellValue(new HSSFRichTextString(String.valueOf(totalMensual)));
            
            celda.setCellStyle(styleBordere);    
            
            subTotalMensual = 0;
            totalMensual = 0;
            
            idRangoEdad++;
        }
        
        /////////////////////////////////////////////////////////////////////////////////////
     
        HSSFCellStyle styleBordere3 = libro.createCellStyle();
        
        row = sheet.getRow(12);
        celda = row.getCell(1);
        
        HSSFCellStyle styleTemp2 = celda.getCellStyle();
        
        styleBordere3.setFont( libro.getFontAt( styleTemp2.getFontIndex() ) );
        styleBordere3.setFillBackgroundColor(HSSFColor.AQUA.index);
        styleBordere3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        styleBordere3.setFillForegroundColor(HSSFColor.AQUA.index);
        styleBordere3.setBorderBottom(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderLeft(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderRight(styleBordere3.BORDER_THIN);
        styleBordere3.setBorderTop(styleBordere3.BORDER_THIN);
        styleBordere3.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        
        //sheet.addMergedRegion(new Region(fila,(short)1,fila,(short)--col));
        
        row = sheet.getRow(fila);
        celda = row.getCell(1);
        celda.setCellValue(new HSSFRichTextString("TOTALES"));
        celda.setCellStyle(styleBordere3);
        
        int k = 2;
        int y2 = 13;
        int acumSubMensual = 0;
        String valorTemp = "";
        while(k <= columnaFinal){
            while(y2 <= 17){
                row = sheet.getRow(y2);
                celda = row.getCell(k);
                valorTemp = celda.getRichStringCellValue().toString();
                acumSubMensual = acumSubMensual + Integer.valueOf(valorTemp);
                y2++;
            }
            
            row = sheet.getRow(y2);
            celda = row.getCell(k);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(acumSubMensual)));
            celda.setCellStyle(styleBordere3);
            y2 = 13;
            acumSubMensual = 0;
            k++;
        }

        libro.write(out);
        out.flush();
        out.close();
            
        }catch(Exception e){
          e.printStackTrace();
        }
    }
 /**
 *@param mesInicial de tipo entero 
 *@return el mes en un tipo de dato cadena. 
 */     
    public String escribirMes(int mesInicial){
        String mes = "";
        switch(mesInicial){
            case 1:
                mes = "Enero";
                break;
            case 2:
                mes = "Febrero";
                break;
            case 3:
                mes = "Marzo";
                break;
            case 4:
                mes = "Abril";
                break;
            case 5:
                mes = "Mayo";
                break;
            case 6:
                mes = "Junio";
                break;
            case 7:
                mes = "Julio";
                break;
            case 8:
                mes = "Agosto";
                break;
            case 9:
                mes = "Septiembre";
                break;
            case 10:
                mes = "Octubre";
                break;
            case 11:
                mes = "Noviembre";
                break;
            default:    
                mes = "Diciembre";
        }
        
        return mes;
    }
}
